#!/usr/bin/python

import sys, os, random, time
import struct

 
RELLENO=21     # 21  = 0x15 -> Relleno de 6 bits bajos de conversion
MARCA=170      # 170 = 0xAA -> Marca de final de serie
NUMCANALES=5   # Numero de canales que lee el medidor

fout = 0 
fin = 0

def EsRelleno(byte):
    return (byte & RELLENO == RELLENO)

def EsMarca(byte):
    return (byte & MARCA == MARCA)

def analizarTime():
#Suponemos que siempre ocupa dos bytes
    strdato=fin.read(1)
    time1 = int(hex(ord(strdato)).replace('0x', ''), 16)
    strdato=fin.read(1)
    time2 = int(hex(ord(strdato)).replace('0x', ''), 16)

    fout.write("time \n")


def main(fichero):
    global fin
    fin=open(fichero,'rb')
    global fout
    fout=open('datos.txt', 'w')

    random.seed(time.time())
    r=random.randint(0, 2199)
    fin.seek(r,os.SEEK_CUR)

#Situarse a la primera marca
    strdato=fin.read(1)

    ant_marca = False;
    encontrado = False;

#Buscar dos marcas consecutivas
    while strdato!='' and not (encontrado):
        dato = int(hex(ord(strdato)).replace('0x', ''), 16)

	print "dato=", hex(dato)

        if EsMarca(dato):
            if ant_marca:
                encontrado = True
            else:
                ant_marca = True
        else:
            ant_marca = False
        
        strdato=fin.read(1)


#Recorrer toda una traza de datos para comprobar que el formato se ajusta con lo que espera el usuario

    for i in range (NUMCANALES*2):
      dato = int(hex(ord(strdato)).replace('0x', ''), 16)

      if i % 2 == 1:
          if not EsRelleno(dato):
              print "ERRROR"
              exit(0)
      strdato=fin.read(1)

#Saltarnos el time y las marcas
    analizarTime()      
    strdato=fin.read(1)
    strdato=fin.read(1)


#Leer y escribir en el nuevo fichero
    cont=0;
    while strdato!='':
        byte1 = int(hex(ord(strdato)).replace('0x', ''), 16)
        strdato = fin.read(1)
        byte2 = int(hex(ord(strdato)).replace('0x', ''), 16)
        dato = byte1 * 4 + (byte2 - RELLENO) / 64
        dato = float (dato)
        fout.write(str(dato) + "\t")
        strdato = fin.read(1)
        cont+=2

        if cont == NUMCANALES*2:
            #Saltarnos el time y las marcas
            cont = 0
            analizarTime()
            strdato=fin.read(1)
            strdato=fin.read(1)

    fbin=open("p.bin",'w+b')
    fbin.write("\x01")
    d=5
    data = struct.pack('b', d)    
    fbin.write(data)
    fbin.write("\x01")
    fbin.close()

    for i in [3,2,1,0]:
        print i

    fin.close()
    fout.close()
    return 0
 
if __name__ == '__main__':
    if len(sys.argv)<2:
        print "Uso: test <nombre_fichero>"
    else:
        if os.path.isfile(sys.argv[1]):
            main(sys.argv[1])
        else:
            print "El fichero no existe"

